package com.itheima.service.impl;

import com.itheima.anno.Log;
import com.itheima.mapper.DeptMapper;
import com.itheima.mapper.EmpMapper;
import com.itheima.pojo.Dept;
import com.itheima.pojo.DeptLog;
import com.itheima.service.DeptLogService;
import com.itheima.service.DeptService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.TransactionManager;
import org.springframework.transaction.annotation.Transactional;

import java.io.FileNotFoundException;
import java.time.LocalDateTime;
import java.util.List;

/*
  部门业务实现类
     要交给spring管理
 */
@Service
@Slf4j
public class DeptServiceImpl implements DeptService {
    // service依赖mapper
    @Autowired
    private DeptMapper deptMapper;//去spring找该类型对象 完成赋值

    @Override
    public List<Dept> list() {
        log.info("查询部门信息,进入业务层了...");
        // do 数据来自于 mapper
        List<Dept> deptList = deptMapper.list();
            // 代码写完了 再alt+enter
        return deptList;
    }

    @Autowired
    private EmpMapper empMapper;//要操作 emp表

    @Autowired
    private DeptLogService deptLogService;//操作 部门日志表
    /**
     * 根据id删除
     * @param id  删除的id
     */
    @Override
    @Log
    @Transactional(rollbackFor = Exception.class)
    // rollbackFor 安装异常类型进行事务管理
    // 加了之后 方法中的代码 要么全部成功要么失败
                  //  只要有代码出现异常就回滚   如果没有问题就提交 影响数据库
    public void deleteById(Integer id) throws Exception {
        // 解散部门
      // 如果没有进行事务控制 解散部门只执行了 删除部门 并没有将员工删除
           // 存在 部门没了 员工还在！！ 要保证 数据的一致性
        // 只能添加事务
     // 开启事务
        // finally{} 语句 最终都要执行的
        try{
            //删除部门
            deptMapper.deleteById(id);
            // 模拟 问题
            int i = 1 / 0;//数学异常 运行期异常 有问题的时候会 回滚的

            //删除该部门下的所有员工
            empMapper.deleteByDeptId(id);
            //没有异常 事务提交
        }finally {
            System.out.println("记录操作日志");
            // 将这次删除动作  插入数据库指定表中
            //创建一个 部门日志对象
            DeptLog deptLog = new DeptLog();
            deptLog.setCreateTime(LocalDateTime.now());
            deptLog.setDescription("执行了删除部门操作，此时解散部门是:"+id+"号部门...");

            deptLogService.insert(deptLog);
        }

    }

    /**
     * 添加 部门信息
     * @param dept
     */
    @Override
    @Log
    public void add(Dept dept) {
        //dept 只有一个 还需要补充 创建时间 修改时间
        dept.setCreateTime(LocalDateTime.now());
        dept.setUpdateTime(LocalDateTime.now());
        // 要mapper存到数据库
        deptMapper.insert(dept);
    }

    /**
     * 根据id查询
     * @param id
     * @return
     */
    @Override
    public Dept getById(Integer id) {

        //mapper
       Dept dept =  deptMapper.getById(id);
        return dept;
    }

    @Override
    @Log
    public void update(Dept dept) {//id  name 还需要更新更新时间
        //补充基础字段
        dept.setUpdateTime(LocalDateTime.now());
        //写sql语句
        deptMapper.update(dept);
    }
}
